#ifndef LOG_H
#define LOG_H

#ifdef __cplusplus
extern "C" {
#endif

#include <stdarg.h>

enum {
	LOG_LEVEL_DEBUG = 1,
		LOG_LEVEL_INFO,
		LOG_LEVEL_WARN,
		LOG_LEVEL_ERR,
		LOG_LEVEL_FATAL
};

/* 设置日志级别,  默认为LOG_LEVEL_WARN */
void log_set_level(int level);

// 非对外接口，不要直接用
int log_msg(int level, const char *file, int line, const char *fmt, ...);

#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
//# pragma message("use STDC")
/* 以LOG_LEVEL_DEBUG记录 */
#define log_debug(fmt, ...) 	\
	log_msg(LOG_LEVEL_DEBUG, __FILE__, __LINE__, fmt, ##__VA_ARGS__)

/* 以LOG_LEVEL_INFO记录 */
#define log_info(fmt, ...) 		\
	log_msg(LOG_LEVEL_INFO, __FILE__, __LINE__, fmt, ##__VA_ARGS__)

/* 以LOG_LEVEL_WARN记录 */
#define log_warn(fmt, ...) 		\
	log_msg(LOG_LEVEL_WARN, __FILE__, __LINE__, fmt, ##__VA_ARGS__)

/* 以LOG_LEVEL_ERR记录 */
#define log_err(fmt, ...)  		\
	log_msg(LOG_LEVEL_ERR, __FILE__, __LINE__, fmt, ##__VA_ARGS__)

/* 以LOG_LEVEL_CRITICAL记录 */
#define log_fatal(fmt, ...)  	\
	log_msg(LOG_LEVEL_FATAL, __FILE__, __LINE__, fmt, ##__VA_ARGS__)

#elif defined __GNUC__
//# pragma message("use GNUC")
/* 以LOG_LEVEL_DEBUG记录 */
#define log_debug(fmt,args...) 		\
	log_msg(LOG_LEVEL_DEBUG, __FILE__, __LINE__, fmt, ##args)

/* 以LOG_LEVEL_INFO记录 */
#define log_info(fmt,args...) 		\
	log_msg(LOG_LEVEL_INFO, __FILE__, __LINE__, fmt, ##args)

/* 以LOG_LEVEL_WARN记录 */
#define log_warn(fmt,args...) 		\
	log_msg(LOG_LEVEL_WARN, __FILE__, __LINE__, fmt, ##args)

/* 以LOG_LEVEL_ERR记录 */
#define log_err(fmt,args...)  		\
	log_msg(LOG_LEVEL_ERR, __FILE__, __LINE__, fmt, ##args)

/* 以LOG_LEVEL_CRITICAL记录 */
#define log_fatal(fmt, args...)  \
	log_msg(LOG_LEVEL_FATAL, __FILE__, __LINE__, fmt, ##args)
#endif

#ifdef __cplusplus
}
#endif

#endif
